package jvm;

import java.util.concurrent.TimeUnit;

/**
 * java程序启动的时候，bootstrap引导类加载器启动jvm jvm启动的时候就已经把堆空间指定大小了
 * 1、设置堆空间大小的参数
 * -X :是jvm的运行参所
 * -Xms :用来设置堆空间（年轻代+老年代）的初始内存大小
 * -Xmx :用来设置堆空间（年轻代+老年代）的最大内存大小
 * -Xms512M -Xmx512M 开发中建议将初始值和最大值设置一样 避免频繁扩容和回退降低用户线程的吞吐量 类似于线程池
 * 由于新生带采用的复制算法 所以 from 和 to 只开辟了一个  eden survivor0(from) survivor1(to)  from 和to 复制之后有交换 谁空谁是to 默认比例8 : 1 : 1
 * -XX:SurvivorRatio=8 不指定的时候会自适应就不一定是8：1：1
 * from 和 to 会被动跟着eden发生YGC一起GC
 * 新生代和老年代 默认比例： 1/3堆空间给了新生代  2/3推空间给了老年代  一般情况下不会修改这个比例
 * -XX:NewRatio=2
 *
 * 2、默认堆空间的大小
 * 初始内存大小：物理电脑内存大小/64
 * 最大内存大小：物理电脑内存大小/4
 *
 * 3、查看设置的参数：1、jps  jstat -gc 进程id
 *                  2、-XX:+PrintGCDetails
 *
 * 4、什么时候去老年代 默认是15次
 * -XX:MaxTenuringThreshold=15
 *
 * @author jack.wu
 * @version 1.0
 * @date 2020-05-16
 */
public class HeapSpace {

    public static void main(String[] args) throws InterruptedException {

        // 默认返回以字节为单位返回
        long totalMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;
        long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;

        System.out.println("-Xms ：" + totalMemory + " M");
        System.out.println("-Xmx ：" + maxMemory + " M");

        System.out.println("系统内存大小为：" + (totalMemory * 64 / 1024) + "G");
        System.out.println("系统内存大小为：" + (maxMemory * 4 / 1024) + "G");

//        TimeUnit.SECONDS.sleep(1000);
    }
}
